First, the fundamental application control structure is an event loop: wait for an event, figure out how to handle it, process the event, then go back and wait for the next one. The structure of the event loop is generic; there is nothing application-specific about it.
Second, the application is passive. It knows how to do certain things, but it's waiting for the user's command to do them. You can imagine programs that do things on their own, without waiting for user instruction (for example, a nuclear reactor control system). But, the interactive part of such a program is still an event loop, which must synchronize with the separate background task(s) to provide the user control.